package service;

import model.Department;
import model.Major;
import utils.DatabaseUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 部门服务类，提供对部门信息和相关专业的操作方法。
 */
public class DepartmentService {

    /**
     * 获取所有部门信息，并按部门代码排序。
     * @return 返回所有部门信息的列表。
     */
    public List<Department> getAllDepartments() {
        List<Department> departments = new ArrayList<>();
        String sql = "SELECT * FROM departments ORDER BY dept_code";

        // 尝试从数据库获取连接并执行查询
        try (Connection conn = DatabaseUtil.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            // 遍历查询结果集，为每个记录创建Department对象并添加到列表中
            while (rs.next()) {
                Department dept = new Department();
                dept.setId(rs.getInt("id"));
                dept.setDeptCode(rs.getString("dept_code"));
                dept.setDeptName(rs.getString("dept_name"));
                dept.setDescription(rs.getString("description"));
                dept.setCreatedAt(rs.getTimestamp("created_at"));
                departments.add(dept);
            }
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
        }
        return departments;
    }

    /**
     * 根据部门代码获取单个部门信息。
     * @param deptCode 部门代码字符串。
     * @return 返回与指定部门代码匹配的Department对象，如果未找到则返回null。
     */
    public Department getDepartmentByCode(String deptCode) {
        String sql = "SELECT * FROM departments WHERE dept_code = ?";

        // 尝试从数据库获取连接并执行查询
        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, deptCode);
            ResultSet rs = pstmt.executeQuery();

            // 如果查询结果有记录，则创建Department对象并返回
            if (rs.next()) {
                Department dept = new Department();
                dept.setId(rs.getInt("id"));
                dept.setDeptCode(rs.getString("dept_code"));
                dept.setDeptName(rs.getString("dept_name"));
                dept.setDescription(rs.getString("description"));
                dept.setCreatedAt(rs.getTimestamp("created_at"));
                return dept;
            }
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 创建新的部门信息并保存到数据库中。
     * @param dept 新部门信息的Department对象。
     * @return 返回操作是否成功的布尔值，true表示成功，false表示失败。
     */
    public boolean createDepartment(Department dept) {
        String sql = "INSERT INTO departments (dept_code, dept_name, description) VALUES (?, ?, ?)";

        // 尝试从数据库获取连接并执行插入操作
        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, dept.getDeptCode());
            pstmt.setString(2, dept.getDeptName());
            pstmt.setString(3, dept.getDescription());

            // 返回插入操作影响的行数是否大于0，即是否成功插入记录
            return pstmt.executeUpdate() > 0;
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 更新指定部门的信息。
     * @param dept 需要更新信息的Department对象。
     * @return 返回操作是否成功的布尔值，true表示成功，false表示失败。
     */
    public boolean updateDepartment(Department dept) {
        String sql = "UPDATE departments SET dept_name = ?, description = ? WHERE dept_code = ?";

        // 尝试从数据库获取连接并执行更新操作
        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, dept.getDeptName());
            pstmt.setString(2, dept.getDescription());
            pstmt.setString(3, dept.getDeptCode());

            // 返回更新操作影响的行数是否大于0，即是否成功更新记录
            return pstmt.executeUpdate() > 0;
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除指定部门信息。
     * @param deptCode 需要删除的部门代码字符串。
     * @return 返回操作是否成功的布尔值，true表示成功，false表示失败。
     */
    public boolean deleteDepartment(String deptCode) {
        String sql = "DELETE FROM departments WHERE dept_code = ?";

        // 尝试从数据库获取连接并执行删除操作
        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, deptCode);
            // 返回删除操作影响的行数是否大于0，即是否成功删除记录
            return pstmt.executeUpdate() > 0;
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取指定部门下的所有专业信息。
     * @param deptCode 部门代码字符串。
     * @return 返回指定部门下的所有Major对象的列表。
     */
    public List<Major> getDepartmentMajors(String deptCode) {
        List<Major> majors = new ArrayList<>();
        String sql = "SELECT * FROM majors WHERE dept_code = ?";

        // 尝试从数据库获取连接并执行查询
        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, deptCode);
            ResultSet rs = pstmt.executeQuery();

            // 遍历查询结果集，为每个记录创建Major对象并添加到列表中
            while (rs.next()) {
                Major major = new Major();
                major.setId(rs.getInt("id"));
                major.setMajorCode(rs.getString("major_code"));
                major.setMajorName(rs.getString("major_name"));
                major.setDescription(rs.getString("description"));
                majors.add(major);
            }
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
        }
        return majors;
    }

    /**
     * 将指定的专业分配给指定的部门。
     * @param deptCode 部门代码字符串。
     * @param majorCode 专业代码字符串。
     * @return 返回操作是否成功的布尔值，true表示成功，false表示失败。
     */
    public boolean assignMajorToDepartment(String deptCode, String majorCode) {
        String sql = "UPDATE majors SET dept_code = ? WHERE major_code = ?";

        // 尝试从数据库获取连接并执行更新操作
        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, deptCode);
            pstmt.setString(2, majorCode);

            // 返回更新操作影响的行数是否大于0，即是否成功更新记录
            return pstmt.executeUpdate() > 0;
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 从指定的专业中移除其与任何部门的关联。
     * @param majorCode 专业代码字符串。
     * @return 返回操作是否成功的布尔值，true表示成功，false表示失败。
     */
    public boolean removeMajorFromDepartment(String majorCode) {
        String sql = "UPDATE majors SET dept_code = NULL WHERE major_code = ?";

        // 尝试从数据库获取连接并执行更新操作
        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, majorCode);
            // 返回更新操作影响的行数是否大于0，即是否成功更新记录
            return pstmt.executeUpdate() > 0;
        } catch (SQLException e) {
            // 打印SQL异常信息
            e.printStackTrace();
            return false;
        }
    }
}
